import { BaseContext } from 'koa';
const uuid = require('uuid');

export default (service: any) => ({
    /**
     * 登录controller，查询用户，生成token，将用户数据放在内存数据库中，将token及用户信息返回
     * @param ctx 请求上下文
     * @param next 执行下一个中间件
     */
    async login(ctx: BaseContext, next: any) {
        const param = ctx.request.body;
        // 参数校验
        if (!param.user_name || !param.password) {
            ctx.body = { code: 1, message: '用户名或密码不能为空' };
            return;
        }
        // 查询用户并修改登录IP
        const _user = await service.user.findOneAndUpdate({ user_name: param.user_name, password: param.password }, { login_ip: ctx.ip }).catch((err: any) => {
            ctx.body = { code: 1, message: err.message };
            return;
        });
        if (!_user) {
            ctx.body = { code: 1, message: '用户名或密码错误' };
            return;
        }
        if (_user.role_id) {
            try {
                const role = await service.role.findById(_user.role_id);
                _user.role = role;
            } catch (error) {
                ctx.body = { code: 1, message: error.message };
                return;
            }
        }
        // 生成token
        const token = uuid.v1();
        service.session.create({
            key: token,
            value: {
                id: _user._id,
                user_name: _user.user_name,
                status: _user.status,
                message_stacks: _user.message_stacks,
                credit_rating: _user.credit_rating,
                create_at: _user.create_at,
                update_at: _user.update_at,
                login_ip: _user.login_ip,
                role: _user.role
            }
        });
        // 返回数据
        ctx.rest({
            token,
            id: _user._id,
            user_name: _user.user_name,
            status: _user.status,
            message_stacks: _user.message_stacks,
            credit_rating: _user.credit_rating,
            create_at: _user.create_at,
            update_at: _user.update_at,
            login_ip: _user.login_ip,
            role: _user.role
        });
    }
});